#include <romkan.h>
#include <map>
#include <regex>
#include <string>
#include <utility>

#define LENGTH(x) (sizeof(x)/sizeof((x)[0]))

const std::pair<const char*, const char*> kunrei[] = {
  std::make_pair("ァ", "xa"),
  std::make_pair("ア", "a"),
  std::make_pair("ィ", "xi"),
  std::make_pair("イ", "i"),
  std::make_pair("ゥ", "xu"),
  std::make_pair("ウ", "u"),
  std::make_pair("ヴ", "vu"),
  std::make_pair("ヴァ", "va"),
  std::make_pair("ヴィ", "vi"),
  std::make_pair("ヴェ", "ve"),
  std::make_pair("ヴォ", "vo"),
  std::make_pair("ェ", "xe"),
  std::make_pair("エ", "e"),
  std::make_pair("ォ", "xo"),
  std::make_pair("オ", "o"),
  std::make_pair("カ", "ka"),
  std::make_pair("ガ", "ga"),
  std::make_pair("キ", "ki"),
  std::make_pair("キャ", "kya"),
  std::make_pair("キュ", "kyu"),
  std::make_pair("キョ", "kyo"),
  std::make_pair("ギ", "gi"),
  std::make_pair("ギャ", "gya"),
  std::make_pair("ギュ", "gyu"),
  std::make_pair("ギョ", "gyo"),
  std::make_pair("ク", "ku"),
  std::make_pair("グ", "gu"),
  std::make_pair("ケ", "ke"),
  std::make_pair("ゲ", "ge"),
  std::make_pair("コ", "ko"),
  std::make_pair("ゴ", "go"),
  std::make_pair("サ", "sa"),
  std::make_pair("ザ", "za"),
  std::make_pair("シ", "si"),
  std::make_pair("シャ", "sya"),
  std::make_pair("シュ", "syu"),
  std::make_pair("ショ", "syo"),
  std::make_pair("シェ", "sye"),
  std::make_pair("ジ", "zi"),
  std::make_pair("ジャ", "zya"),
  std::make_pair("ジュ", "zyu"),
  std::make_pair("ジョ", "zyo"),
  std::make_pair("ス", "su"),
  std::make_pair("ズ", "zu"),
  std::make_pair("セ", "se"),
  std::make_pair("ゼ", "ze"),
  std::make_pair("ソ", "so"),
  std::make_pair("ゾ", "zo"),
  std::make_pair("タ", "ta"),
  std::make_pair("ダ", "da"),
  std::make_pair("チ", "ti"),
  std::make_pair("チャ", "tya"),
  std::make_pair("チュ", "tyu"),
  std::make_pair("チョ", "tyo"),
  std::make_pair("ヂ", "di"),
  std::make_pair("ヂャ", "dya"),
  std::make_pair("ヂュ", "dyu"),
  std::make_pair("ヂョ", "dyo"),
  std::make_pair("ティ", "thi"),
  std::make_pair("ッ", "xtu"),
  std::make_pair("ッヴ", "vvu"),
  std::make_pair("ッヴァ", "vva"),
  std::make_pair("ッヴィ", "vvi"),
  std::make_pair("ッヴェ", "vve"),
  std::make_pair("ッヴォ", "vvo"),
  std::make_pair("ッカ", "kka"),
  std::make_pair("ッガ", "gga"),
  std::make_pair("ッキ", "kki"),
  std::make_pair("ッキャ", "kkya"),
  std::make_pair("ッキュ", "kkyu"),
  std::make_pair("ッキョ", "kkyo"),
  std::make_pair("ッギ", "ggi"),
  std::make_pair("ッギャ", "ggya"),
  std::make_pair("ッギュ", "ggyu"),
  std::make_pair("ッギョ", "ggyo"),
  std::make_pair("ック", "kku"),
  std::make_pair("ッグ", "ggu"),
  std::make_pair("ッケ", "kke"),
  std::make_pair("ッゲ", "gge"),
  std::make_pair("ッコ", "kko"),
  std::make_pair("ッゴ", "ggo"),
  std::make_pair("ッサ", "ssa"),
  std::make_pair("ッザ", "zza"),
  std::make_pair("ッシ", "ssi"),
  std::make_pair("ッシャ", "ssya"),
  std::make_pair("ッシュ", "ssyu"),
  std::make_pair("ッショ", "ssho"),
  std::make_pair("ッシェ", "ssye"),
  std::make_pair("ッジ", "zzi"),
  std::make_pair("ッジャ", "zzya"),
  std::make_pair("ッジュ", "zzyu"),
  std::make_pair("ッジョ", "zzyo"),
  std::make_pair("ッス", "ssu"),
  std::make_pair("ッズ", "zzu"),
  std::make_pair("ッセ", "sse"),
  std::make_pair("ッゼ", "zze"),
  std::make_pair("ッソ", "sso"),
  std::make_pair("ッゾ", "zzo"),
  std::make_pair("ッタ", "tta"),
  std::make_pair("ッダ", "dda"),
  std::make_pair("ッチ", "tti"),
  std::make_pair("ッティ", "tti"),
  std::make_pair("ッチャ", "ttya"),
  std::make_pair("ッチュ", "ttyu"),
  std::make_pair("ッチョ", "ttyo"),
  std::make_pair("ッヂ", "ddi"),
  std::make_pair("ッヂャ", "ddya"),
  std::make_pair("ッヂュ", "ddyu"),
  std::make_pair("ッヂョ", "ddyo"),
  std::make_pair("ッツ", "ttu"),
  std::make_pair("ッヅ", "ddu"),
  std::make_pair("ッテ", "tte"),
  std::make_pair("ッデ", "dde"),
  std::make_pair("ット", "tto"),
  std::make_pair("ッド", "ddo"),
  std::make_pair("ッドゥ", "ddu"),
  std::make_pair("ッハ", "hha"),
  std::make_pair("ッバ", "bba"),
  std::make_pair("ッパ", "ppa"),
  std::make_pair("ッヒ", "hhi"),
  std::make_pair("ッヒャ", "hhya"),
  std::make_pair("ッヒュ", "hhyu"),
  std::make_pair("ッヒョ", "hhyo"),
  std::make_pair("ッビ", "bbi"),
  std::make_pair("ッビャ", "bbya"),
  std::make_pair("ッビュ", "bbyu"),
  std::make_pair("ッビョ", "bbyo"),
  std::make_pair("ッピ", "ppi"),
  std::make_pair("ッピャ", "ppya"),
  std::make_pair("ッピュ", "ppyu"),
  std::make_pair("ッピョ", "ppyo"),
  std::make_pair("ッフ", "hhu"),
  std::make_pair("ッフュ", "ffu"),
  std::make_pair("ッファ", "ffa"),
  std::make_pair("ッフィ", "ffi"),
  std::make_pair("ッフェ", "ffe"),
  std::make_pair("ッフォ", "ffo"),
  std::make_pair("ッブ", "bbu"),
  std::make_pair("ップ", "ppu"),
  std::make_pair("ッヘ", "hhe"),
  std::make_pair("ッベ", "bbe"),
  std::make_pair("ッペ", "ppe"),
  std::make_pair("ッホ", "hho"),
  std::make_pair("ッボ", "bbo"),
  std::make_pair("ッポ", "ppo"),
  std::make_pair("ッヤ", "yya"),
  std::make_pair("ッユ", "yyu"),
  std::make_pair("ッヨ", "yyo"),
  std::make_pair("ッラ", "rra"),
  std::make_pair("ッリ", "rri"),
  std::make_pair("ッリャ", "rrya"),
  std::make_pair("ッリュ", "rryu"),
  std::make_pair("ッリョ", "rryo"),
  std::make_pair("ッル", "rru"),
  std::make_pair("ッレ", "rre"),
  std::make_pair("ッロ", "rro"),
  std::make_pair("ツ", "tu"),
  std::make_pair("ヅ", "du"),
  std::make_pair("テ", "te"),
  std::make_pair("デ", "de"),
  std::make_pair("ト", "to"),
  std::make_pair("ド", "do"),
  std::make_pair("ドゥ", "dhu"),
  std::make_pair("ナ", "na"),
  std::make_pair("ニ", "ni"),
  std::make_pair("ニャ", "nya"),
  std::make_pair("ニュ", "nyu"),
  std::make_pair("ニョ", "nyo"),
  std::make_pair("ヌ", "nu"),
  std::make_pair("ネ", "ne"),
  std::make_pair("ノ", "no"),
  std::make_pair("ハ", "ha"),
  std::make_pair("バ", "ba"),
  std::make_pair("パ", "pa"),
  std::make_pair("ヒ", "hi"),
  std::make_pair("ヒャ", "hya"),
  std::make_pair("ヒュ", "hyu"),
  std::make_pair("ヒョ", "hyo"),
  std::make_pair("ビ", "bi"),
  std::make_pair("ビャ", "bya"),
  std::make_pair("ビュ", "byu"),
  std::make_pair("ビョ", "byo"),
  std::make_pair("ピ", "pi"),
  std::make_pair("ピャ", "pya"),
  std::make_pair("ピュ", "pyu"),
  std::make_pair("ピョ", "pyo"),
  std::make_pair("フ", "hu"),
  std::make_pair("ファ", "fa"),
  std::make_pair("フィ", "fi"),
  std::make_pair("フェ", "fe"),
  std::make_pair("フォ", "fo"),
  std::make_pair("フュ", "fyu"),
  std::make_pair("ブ", "bu"),
  std::make_pair("プ", "pu"),
  std::make_pair("ヘ", "he"),
  std::make_pair("ベ", "be"),
  std::make_pair("ペ", "pe"),
  std::make_pair("ホ", "ho"),
  std::make_pair("ボ", "bo"),
  std::make_pair("ポ", "po"),
  std::make_pair("マ", "ma"),
  std::make_pair("ミ", "mi"),
  std::make_pair("ミャ", "mya"),
  std::make_pair("ミュ", "myu"),
  std::make_pair("ミョ", "myo"),
  std::make_pair("ム", "mu"),
  std::make_pair("メ", "me"),
  std::make_pair("モ", "mo"),
  std::make_pair("ャ", "xya"),
  std::make_pair("ヤ", "ya"),
  std::make_pair("ュ", "xyu"),
  std::make_pair("ユ", "yu"),
  std::make_pair("ョ", "xyo"),
  std::make_pair("ヨ", "yo"),
  std::make_pair("ラ", "ra"),
  std::make_pair("リ", "ri"),
  std::make_pair("リャ", "rya"),
  std::make_pair("リュ", "ryu"),
  std::make_pair("リョ", "ryo"),
  std::make_pair("ル", "ru"),
  std::make_pair("レ", "re"),
  std::make_pair("ロ", "ro"),
  std::make_pair("ヮ", "xwa"),
  std::make_pair("ワ", "wa"),
  std::make_pair("ウィ", "wi"),
  std::make_pair("ウィ", "whi"),
  std::make_pair("ヰ", "wyi"),
  std::make_pair("ヱ", "wye"),
  std::make_pair("ウェ", "we"),
  std::make_pair("ヲ", "wo"),
  std::make_pair("ウォ", "who"),
  std::make_pair("ン", "n"),
  std::make_pair("ン", "n'"),
  std::make_pair("ディ", "dyi"),
  std::make_pair("ー", "-"),
  std::make_pair("チェ", "tye"),
  std::make_pair("ッチェ", "ttye"),
  std::make_pair("ジェ", "zye"),
}, hepburn[] = {
  std::make_pair("ァ", "xa"),
  std::make_pair("ア", "a"),
  std::make_pair("ィ", "xi"),
  std::make_pair("イ", "i"),
  std::make_pair("ゥ", "xu"),
  std::make_pair("ウ", "u"),
  std::make_pair("ヴ", "vu"),
  std::make_pair("ヴァ", "va"),
  std::make_pair("ヴィ", "vi"),
  std::make_pair("ヴェ", "ve"),
  std::make_pair("ヴォ", "vo"),
  std::make_pair("ェ", "xe"),
  std::make_pair("エ", "e"),
  std::make_pair("ォ", "xo"),
  std::make_pair("オ", "o"),
  std::make_pair("カ", "ka"),
  std::make_pair("ガ", "ga"),
  std::make_pair("キ", "ki"),
  std::make_pair("キャ", "kya"),
  std::make_pair("キュ", "kyu"),
  std::make_pair("キョ", "kyo"),
  std::make_pair("ギ", "gi"),
  std::make_pair("ギャ", "gya"),
  std::make_pair("ギュ", "gyu"),
  std::make_pair("ギョ", "gyo"),
  std::make_pair("ク", "ku"),
  std::make_pair("グ", "gu"),
  std::make_pair("ケ", "ke"),
  std::make_pair("ゲ", "ge"),
  std::make_pair("コ", "ko"),
  std::make_pair("ゴ", "go"),
  std::make_pair("サ", "sa"),
  std::make_pair("ザ", "za"),
  std::make_pair("シ", "shi"),
  std::make_pair("シャ", "sha"),
  std::make_pair("シュ", "shu"),
  std::make_pair("ショ", "sho"),
  std::make_pair("シェ", "she"),
  std::make_pair("ジ", "ji"),
  std::make_pair("ジャ", "ja"),
  std::make_pair("ジュ", "ju"),
  std::make_pair("ジョ", "jo"),
  std::make_pair("ス", "su"),
  std::make_pair("ズ", "zu"),
  std::make_pair("セ", "se"),
  std::make_pair("ゼ", "ze"),
  std::make_pair("ソ", "so"),
  std::make_pair("ゾ", "zo"),
  std::make_pair("タ", "ta"),
  std::make_pair("ダ", "da"),
  std::make_pair("チ", "chi"),
  std::make_pair("チャ", "cha"),
  std::make_pair("チュ", "chu"),
  std::make_pair("チョ", "cho"),
  std::make_pair("ヂ", "di"),
  std::make_pair("ヂャ", "dya"),
  std::make_pair("ヂュ", "dyu"),
  std::make_pair("ヂョ", "dyo"),
  std::make_pair("ティ", "ti"),
  std::make_pair("ッ", "xtsu"),
  std::make_pair("ッヴ", "vvu"),
  std::make_pair("ッヴァ", "vva"),
  std::make_pair("ッヴィ", "vvi"),
  std::make_pair("ッヴェ", "vve"),
  std::make_pair("ッヴォ", "vvo"),
  std::make_pair("ッカ", "kka"),
  std::make_pair("ッガ", "gga"),
  std::make_pair("ッキ", "kki"),
  std::make_pair("ッキャ", "kkya"),
  std::make_pair("ッキュ", "kkyu"),
  std::make_pair("ッキョ", "kkyo"),
  std::make_pair("ッギ", "ggi"),
  std::make_pair("ッギャ", "ggya"),
  std::make_pair("ッギュ", "ggyu"),
  std::make_pair("ッギョ", "ggyo"),
  std::make_pair("ック", "kku"),
  std::make_pair("ッグ", "ggu"),
  std::make_pair("ッケ", "kke"),
  std::make_pair("ッゲ", "gge"),
  std::make_pair("ッコ", "kko"),
  std::make_pair("ッゴ", "ggo"),
  std::make_pair("ッサ", "ssa"),
  std::make_pair("ッザ", "zza"),
  std::make_pair("ッシ", "sshi"),
  std::make_pair("ッシャ", "ssha"),
  std::make_pair("ッシュ", "sshu"),
  std::make_pair("ッショ", "ssho"),
  std::make_pair("ッシェ", "sshe"),
  std::make_pair("ッジ", "jji"),
  std::make_pair("ッジャ", "jja"),
  std::make_pair("ッジュ", "jju"),
  std::make_pair("ッジョ", "jjo"),
  std::make_pair("ッス", "ssu"),
  std::make_pair("ッズ", "zzu"),
  std::make_pair("ッセ", "sse"),
  std::make_pair("ッゼ", "zze"),
  std::make_pair("ッソ", "sso"),
  std::make_pair("ッゾ", "zzo"),
  std::make_pair("ッタ", "tta"),
  std::make_pair("ッダ", "dda"),
  std::make_pair("ッチ", "cchi"),
  std::make_pair("ッティ", "tti"),
  std::make_pair("ッチャ", "ccha"),
  std::make_pair("ッチュ", "cchu"),
  std::make_pair("ッチョ", "ccho"),
  std::make_pair("ッヂ", "ddi"),
  std::make_pair("ッヂャ", "ddya"),
  std::make_pair("ッヂュ", "ddyu"),
  std::make_pair("ッヂョ", "ddyo"),
  std::make_pair("ッツ", "ttsu"),
  std::make_pair("ッヅ", "ddu"),
  std::make_pair("ッテ", "tte"),
  std::make_pair("ッデ", "dde"),
  std::make_pair("ット", "tto"),
  std::make_pair("ッド", "ddo"),
  std::make_pair("ッドゥ", "ddu"),
  std::make_pair("ッハ", "hha"),
  std::make_pair("ッバ", "bba"),
  std::make_pair("ッパ", "ppa"),
  std::make_pair("ッヒ", "hhi"),
  std::make_pair("ッヒャ", "hhya"),
  std::make_pair("ッヒュ", "hhyu"),
  std::make_pair("ッヒョ", "hhyo"),
  std::make_pair("ッビ", "bbi"),
  std::make_pair("ッビャ", "bbya"),
  std::make_pair("ッビュ", "bbyu"),
  std::make_pair("ッビョ", "bbyo"),
  std::make_pair("ッピ", "ppi"),
  std::make_pair("ッピャ", "ppya"),
  std::make_pair("ッピュ", "ppyu"),
  std::make_pair("ッピョ", "ppyo"),
  std::make_pair("ッフ", "ffu"),
  std::make_pair("ッフュ", "ffu"),
  std::make_pair("ッファ", "ffa"),
  std::make_pair("ッフィ", "ffi"),
  std::make_pair("ッフェ", "ffe"),
  std::make_pair("ッフォ", "ffo"),
  std::make_pair("ッブ", "bbu"),
  std::make_pair("ップ", "ppu"),
  std::make_pair("ッヘ", "hhe"),
  std::make_pair("ッベ", "bbe"),
  std::make_pair("ッペ", "ppe"),
  std::make_pair("ッホ", "hho"),
  std::make_pair("ッボ", "bbo"),
  std::make_pair("ッポ", "ppo"),
  std::make_pair("ッヤ", "yya"),
  std::make_pair("ッユ", "yyu"),
  std::make_pair("ッヨ", "yyo"),
  std::make_pair("ッラ", "rra"),
  std::make_pair("ッリ", "rri"),
  std::make_pair("ッリャ", "rrya"),
  std::make_pair("ッリュ", "rryu"),
  std::make_pair("ッリョ", "rryo"),
  std::make_pair("ッル", "rru"),
  std::make_pair("ッレ", "rre"),
  std::make_pair("ッロ", "rro"),
  std::make_pair("ツ", "tsu"),
  std::make_pair("ヅ", "du"),
  std::make_pair("テ", "te"),
  std::make_pair("デ", "de"),
  std::make_pair("ト", "to"),
  std::make_pair("ド", "do"),
  std::make_pair("ドゥ", "dwu"),
  std::make_pair("ナ", "na"),
  std::make_pair("ニ", "ni"),
  std::make_pair("ニャ", "nya"),
  std::make_pair("ニュ", "nyu"),
  std::make_pair("ニョ", "nyo"),
  std::make_pair("ヌ", "nu"),
  std::make_pair("ネ", "ne"),
  std::make_pair("ノ", "no"),
  std::make_pair("ハ", "ha"),
  std::make_pair("バ", "ba"),
  std::make_pair("パ", "pa"),
  std::make_pair("ヒ", "hi"),
  std::make_pair("ヒャ", "hya"),
  std::make_pair("ヒュ", "hyu"),
  std::make_pair("ヒョ", "hyo"),
  std::make_pair("ビ", "bi"),
  std::make_pair("ビャ", "bya"),
  std::make_pair("ビュ", "byu"),
  std::make_pair("ビョ", "byo"),
  std::make_pair("ピ", "pi"),
  std::make_pair("ピャ", "pya"),
  std::make_pair("ピュ", "pyu"),
  std::make_pair("ピョ", "pyo"),
  std::make_pair("フ", "fu"),
  std::make_pair("ファ", "fa"),
  std::make_pair("フィ", "fi"),
  std::make_pair("フェ", "fe"),
  std::make_pair("フォ", "fo"),
  std::make_pair("フュ", "fyu"),
  std::make_pair("ブ", "bu"),
  std::make_pair("プ", "pu"),
  std::make_pair("ヘ", "he"),
  std::make_pair("ベ", "be"),
  std::make_pair("ペ", "pe"),
  std::make_pair("ホ", "ho"),
  std::make_pair("ボ", "bo"),
  std::make_pair("ポ", "po"),
  std::make_pair("マ", "ma"),
  std::make_pair("ミ", "mi"),
  std::make_pair("ミャ", "mya"),
  std::make_pair("ミュ", "myu"),
  std::make_pair("ミョ", "myo"),
  std::make_pair("ム", "mu"),
  std::make_pair("メ", "me"),
  std::make_pair("モ", "mo"),
  std::make_pair("ャ", "xya"),
  std::make_pair("ヤ", "ya"),
  std::make_pair("ュ", "xyu"),
  std::make_pair("ユ", "yu"),
  std::make_pair("ョ", "xyo"),
  std::make_pair("ヨ", "yo"),
  std::make_pair("ラ", "ra"),
  std::make_pair("リ", "ri"),
  std::make_pair("リャ", "rya"),
  std::make_pair("リュ", "ryu"),
  std::make_pair("リョ", "ryo"),
  std::make_pair("ル", "ru"),
  std::make_pair("レ", "re"),
  std::make_pair("ロ", "ro"),
  std::make_pair("ヮ", "xwa"),
  std::make_pair("ワ", "wa"),
  std::make_pair("ウィ", "wi"),
  std::make_pair("ウィ", "whi"),
  std::make_pair("ヰ", "wyi"),
  std::make_pair("ヱ", "wye"),
  std::make_pair("ウェ", "we"),
  std::make_pair("ウェ", "whe"),
  std::make_pair("ヲ", "wo"),
  std::make_pair("ウォ", "who"),
  std::make_pair("ン", "n"),
  std::make_pair("ン", "n'"),
  std::make_pair("ディ", "dhi"),
  std::make_pair("ー", "-"),
  std::make_pair("チェ", "che"),
  std::make_pair("ッチェ", "cche"),
  std::make_pair("ジェ", "je"),
};

class RomkanDict
{
public:
  std::regex m_rompat, m_kanpat;
  RomkanDict();

private:
  typedef std::map<std::string, std::string> strstrmap_t;
  std::map<std::string, std::string> m_kanrom, m_romkan;
};
